package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.common.util.AppJwtUtil;
import com.heima.user.dto.LoginDto;
import com.heima.user.entity.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.IApUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * APP用户信息表 服务实现类
 * </p>
 *
 * @author ZC
 * @since 2022-06-28
 */
@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements IApUserService {

    @Override
    public ResponseResult login(LoginDto dto) {
        //存在两种情况    先看看(不登录)  和登录两种状态
        //先判断dto的值是否为空
        if(dto==null||StringUtils.isBlank(dto.getEquipmentId())){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
        //判断 电话号和密码是否为空
        if(StringUtils.isNotBlank(dto.getPhone())&&StringUtils.isNotBlank(dto.getPassword())){
            //情况一  根据手机号和密码登录的
            LambdaQueryWrapper<ApUser> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(ApUser::getPhone,dto.getPhone());
            ApUser one = this.getOne(queryWrapper);
            //如果在数据库中出查不到相关数据  则返回错误信息
            if(one==null){
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
            }
            //执行到这  说明  账号准确  下面进行密码的比对
            //再重新加密时注意再带上盐 one.getSalt()
            //把明文密码+one.getSalt() 通过md5加密后再和表中加密后的密码比较
            String password_page = DigestUtils.md5Hex(dto.getPassword() + one.getSalt());
            if (! StringUtils.equals(password_page,one.getPassword())) {
                //密码不一致 返回密码错误的提示
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }
            //返回结果集
            Map resultMap = new HashMap();
            one.setPassword(""); //去除敏感数据
            one.setSalt("");   //去除敏感数据  盐
            one.setPhone("");  //去除敏感数据
            resultMap.put("user",one);
            //根据JWT生成token
            Map<String, Object> claimMaps = new HashMap<>();
            claimMaps.put("userId",one.getId());
            claimMaps.put("name",one.getName());
            String token = AppJwtUtil.getToken(claimMaps);
            resultMap.put("token",token);
            //返回map
            return ResponseResult.okResult(resultMap);
        }
        //情况二   游客  就看看
        else{
            //根据设备id生成token  userId设置成0
            ApUser one = new ApUser();
            one.setId(0);     //生成一个id为 0
            Map resultMap = new HashMap();
            resultMap.put("user",one);
            //根据JWT生成token
            Map<String, Object> claimMaps = new HashMap<>();
            claimMaps.put("userId",one.getId());
            claimMaps.put("name","");   //无 用户名
            claimMaps.put("equipmentId", dto.getEquipmentId());
            String token = AppJwtUtil.getToken(claimMaps);
            resultMap.put("token",token);
            return ResponseResult.okResult(resultMap);
        }
    }
}
